package org.centsuse.intention_spring.invention.entities.contexts;

import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.memory.ChatMemory;
import org.centsuse.intention_spring.invention.config.scenes.SceneConfig;
import org.centsuse.intention_spring.invention.config.scenes.SceneSlotTemplate;

import java.util.Map;

/**
 * 对话上下文
 */
public interface DialogueContext {

    /**
     * @description 初始化槽值
     * @param sceneConfig sceneConfig
     */
    void initSlot(SceneConfig sceneConfig);

    /**
     * @description 初始化记忆
     */
    void initChatMemory();

    /**
     * @description 获取会话id
     * @return String 会话id
     */
    String getSessionId();

    /**
     * @description 获取当前会话意图
     * @return String
     */
    String getCurrentPurpose();

    /**
     * @description 更新当前会话意图
     * @param purpose purpose
     * @return String
     */
    String updateCurrentPurpose(String purpose);

    /**
     * @description 获取对话信息槽
     * @return 信息槽map
     */
    Map<String, SceneSlotTemplate> getSlots();

    /**
     * @description 更新对话信息槽
     * @param key key值
     * @param slotTemplate value值
     */
    void updateSlot(String key, SceneSlotTemplate slotTemplate);

    /**
     * @description 初始化历史会话记录
     * @param chatMemory
     */
    void initChatMemory(ChatMemory chatMemory);

    /**
     * @description 添加消息
     * @param message
     */
    void addMemory(String message);

    /**
     * @description 获取历史记录
     * @return ChatMemory
     */
    ChatMemory getMemory();

    /**
     * @description 根据指定的key获取槽值value
     * @param key key值
     * @param type 槽值类型
     * @return T 槽值
     * @param <T> 槽值泛型
     */
    default <T> T getSlotValue(String key, Class<T> type) {
        return type.cast(getSlots().get(key));
    }
}